package com.bocai.service.impl;

import com.bocai.bean.CropImage;
import com.bocai.service.UploadFileService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

/**
  * @ClassName: UploadFileServiceImpl 
  * @Description: 上传文件实现类 
  * @author zyn161616@163.com 
  * @date 2017年9月11日 下午4:07:12
 */
@Service
public class UploadFileServiceImpl implements UploadFileService {


	/**文件存放目录*/
	private String IMG_PRJ_PATH = "/image/";
	/**临时文件存放目录*/
	private String IMG_PRJ_PATH_TMP = "/image/image_tmp/";
	/**临时剪裁文件存放目录*/
	private String IMG_PRJ_PATH_CROP = "/image/crop/";
	/**临时文件存放目录*/
	private String DIR_TMP = "temp"; 
	private int INT_SCALE = 2;
	
	
	/**
	* @Title: uploadImageToServer 
	* @Description: 上传文件到服务器
	* @param @param imageFile
	* @param @param request
	* @param @return    
	* @return Map<String,Object>     
	* @throws
	 */
	@Override
	public Map<String, Object> uploadImageToServer(MultipartFile imageFile, HttpServletRequest request) {
		//创建携参Map
		Map<String, Object> params = new HashMap<String, Object>();
		try {
			//获取请求路径头
			String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort(); 
			
			//获取文件路径
			String filePath = getFilePath(request, IMG_PRJ_PATH_TMP);
			
			//获取文件名
			String fileName = imageFile.getOriginalFilename();
			//赋值
			fileName = 
					String.format("%s_%s", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()), 
							new Random().nextInt(10000))+fileName.substring(fileName.lastIndexOf("."));
			
			//创建文件
			File targetFile = new File(filePath ,fileName);
			//如果目录不存在
			if (!targetFile.exists()) {
				//那么创建
				targetFile.mkdirs();
			}
			
			// 保存到服务器物理磁盘
			try {
				imageFile.transferTo(targetFile);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			BufferedImage img = ImageIO.read(targetFile);
			// croppic 需要的属性
			params.put("status", "success");
			params.put("url",  basePath+IMG_PRJ_PATH_TMP +fileName);
			params.put("width", img.getWidth());
			params.put("height", img.getHeight());
			System.out.println("imageUrl = " + basePath+IMG_PRJ_PATH_TMP +fileName);
		
		}catch (Exception e) {
			e.printStackTrace();
			params.put("status", "error");
			params.put("message", "your error message text");
		}
		//返回
		return params;
	}
	
	
	/**
	* @Title: webImgCrop 
	* @Description: 上传文件
	* @param @param imgUrl
	* @param @param imgW
	* @param @param imgH
	* @param @param imgX1
	* @param @param imgY1
	* @param @param cropW
	* @param @param cropH
	* @param @param request
	* @param @return    
	* @return Map<String,Object>     
	* @throws
	 */
	public Map<String, Object> webImgCrop(String imgUrl,double imgW,double imgH,Integer imgX1,Integer imgY1,Integer cropW,Integer cropH,HttpServletRequest request){
		//创建返回Map
		Map<String, Object> map=new HashMap<String, Object>();
		try {
			//获取请求路径开端
			String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
			//声明变量
			String filePath = "user/";

			CropImage image=new CropImage((int)imgW * INT_SCALE, (int)imgH * INT_SCALE, imgX1 * INT_SCALE, imgY1 *INT_SCALE, cropW * INT_SCALE, cropH * INT_SCALE);
			
			String IMG_URL = "";
			String subpath = "";//要保存的文件本地路径
			String url = "";//照片网络路径
			if(imgUrl.indexOf(IMG_PRJ_PATH_TMP) != -1){ //上传新照片
				IMG_URL = imgUrl.split(IMG_PRJ_PATH_TMP)[1];
				imgUrl = getFilePath(request, IMG_PRJ_PATH_TMP) + IMG_URL;
				subpath = getFilePath(request, IMG_PRJ_PATH_CROP) + IMG_URL;
				url = IMG_PRJ_PATH_CROP + IMG_URL;
			} else if(imgUrl.indexOf(IMG_PRJ_PATH_CROP) != -1){ //修改上传到image/crop下的照片
				url = imgUrl;
				IMG_URL = imgUrl.split(IMG_PRJ_PATH_CROP)[1];
				imgUrl = getFilePath(request, IMG_PRJ_PATH_CROP) + IMG_URL;
				subpath = imgUrl;
			} else { // 修改上传到image/activityId/brideId下的照片
				url = imgUrl;
				IMG_URL = imgUrl.split(IMG_PRJ_PATH)[1];
				imgUrl = getFilePath(request, IMG_PRJ_PATH) + IMG_URL;
				subpath = imgUrl;
				IMG_URL = IMG_URL.indexOf("/"+ DIR_TMP +"/") != -1? IMG_URL.split(DIR_TMP +"/")[1]: IMG_URL.replace(filePath, "");
			}

			subpath = getFilePath(request, IMG_PRJ_PATH) + filePath + IMG_URL;
			url = IMG_PRJ_PATH + filePath + IMG_URL; //照片网络路径
			url = url.replace("//", "/");
			
			image.setSrcPath(imgUrl);
			image.setSubPath(subpath);
			image.cut();
			if(!subpath.equals(imgUrl)){
				this.deleteFile(imgUrl);
			}
			map.put("status", "success");
			map.put("url", basePath + url);
		} catch (Exception e) {
			e.printStackTrace();
			map.put("status", "error");
			map.put("message", "your error message text");
		}
		return map;
	}
	
	
	
	
	/**
	* @Title: getFilePath 
	* @Description: 获取文件存储路径
	* @param @param request
	* @param @param path
	* @param @return    
	* @return String     
	* @throws
	 */
	private String getFilePath(HttpServletRequest request, String path){
		// 项目本地根目录
		//req.getSession().getServletContext().getRealPath("/") = "E:\tomcat-out\HunParUpload\webapps\HunParUpload\"
		String filePath = request.getSession().getServletContext().getRealPath("/").replace("\\", "/");
		
		//返回当前文件存储路径
		return filePath.substring(0, filePath.lastIndexOf(request.getContextPath()))+ path;
	}
	
	/**
	* @Title: deleteFile 
	* @Description: 删除文件
	* @param @param filePath
	* @param @return    
	* @return boolean     
	* @throws
	 */
	private boolean deleteFile(String filePath){
		// 如果当前文件路径为空
		if (StringUtils.isEmpty(filePath)) {
			// 返回
			return false;
		}
		// 创建文件对象
		File file = new File(filePath);
		// 如果是存在的
		if (file.exists()) {
			// 删除
			return file.delete();
		}
		return false;
	}

	/**
	 * 导入Excel表格数据到DB
	 * @param excelFile
	 * @return
	 */
	@Override
	public String changeImportExcelData2DB(MultipartFile excelFile){
//		//声明默认返回信息
//		String resultMsg = CodeEnum.CODE_60001.getMessage();
//
//		//读取Excel数据
//		Map<Integer,Object> excels = new ExcelTool().readExcel(excelFile);
//		//如果返回结果不为空
//		if(ObjUtils.isNotEmpty(excels)){
//			//获取B端信息
//			Object[][] userInfoBs = (Object[][]) excels.get(0);
//			//获取C端信息
//			Object[][] userInfoCs = (Object[][]) excels.get(2);
//
//			//如果B端Excel数据不为空
//			if(ObjUtils.isNotEmpty(userInfoBs)){
//				//插入数据库
//				getUserB4Excel2DB(userInfoBs);
//			}
//
//			//如果C端Excel数据不为空
//			if(ObjUtils.isNotEmpty(userInfoCs)){
//				//插入数据库
//				getUserC4Excel2DB(userInfoCs);
//			}
//
//			//返回成功信息
//			return  CodeEnum.SUCCESS.getMessage();
//		}
//		//返回
//		return resultMsg;
        return "";
	}

	/**
	 * B端Excel数据批量插入DB
	 * @param userInfoBs
	 * @return
	 */
	private void getUserB4Excel2DB(Object[][] userInfoBs){

//		//如果数据不为空
//		if(ObjUtils.isNotEmpty(userInfoBs)){
//			for (int i = 0; i < userInfoBs.length; i++) {
//				//创建B端对象
//				UserInfoB userB = new UserInfoB();
//				if(ObjUtils.isNotEmpty(userInfoBs[i][0])){
//					userB.setUserPhone( userInfoBs[i][0].toString());
//				}
//				if(ObjUtils.isNotEmpty(userInfoBs[i][1])){
//					userB.setUserName( userInfoBs[i][1].toString());
//				}
//				if(ObjUtils.isNotEmpty(userInfoBs[i][2])){
//					userB.setUserTel(userInfoBs[i][2].toString());
//				}
//				if(ObjUtils.isNotEmpty(userInfoBs[i][3])){
//					userB.setDepositMoney(Integer.parseInt(userInfoBs[i][3].toString()));
//				}
//				//默认密码 123456
//				userB.setUserPwd(MD5Utils.md5Password(SysConstant.userPwd));
//
//				//通过电话号获取DB中数据
//				UserInfoB DBuserInfoB = userInfoBMapper.selectByUserPhone(userB.getUserPhone());
//				//如果DB中信息存在
//				if(ObjUtils.isNotEmpty(DBuserInfoB)){
//					//执行修改操作
//					userB.setUserId(DBuserInfoB.getUserId());
//					userInfoBMapper.updateByPrimaryKeySelective(userB);
//				}else{
//					//如果不存在，执行插入操作
//					userInfoBMapper.insertSelective(userB);
//				}
//			}
//		}
	}

	/**
	 * C端Excel数据批量插入DB
	 * @param userInfoCs
	 * @return
	 */
	private void getUserC4Excel2DB(Object[][] userInfoCs){
//		//如果数据不为空
//		if(ObjUtils.isNotEmpty(userInfoCs)){
//			for (int i = 0; i < userInfoCs.length; i++) {
//				//创建c端对象
//				UserInfoC userC = new UserInfoC();
//				//校验参数
//				if(ObjUtils.isNotEmpty(userInfoCs[i][0])){
//					userC.setUserName(userInfoCs[i][0].toString());
//				}
//
//				//校验参数
//				if(ObjUtils.isNotEmpty(userInfoCs[i][1])){
//					userC.setUserTel(userInfoCs[i][1].toString());
//				}
//				//校验参数
//				if(ObjUtils.isNotEmpty(userInfoCs[i][2])){
//					userC.setUserGender(Double.valueOf(userInfoCs[i][2].toString()).intValue());
//				}
//				//校验参数
//				if(ObjUtils.isNotEmpty(userInfoCs[i][3])){
//					userC.setUserWxNo(userInfoCs[i][3].toString());
//				}
//				//校验参数
//				if(ObjUtils.isNotEmpty(userInfoCs[i][4])){
//					userC.setUserQqNo(userInfoCs[i][4].toString());
//				}
//				//校验参数
//				if(ObjUtils.isNotEmpty(userInfoCs[i][5])){
//					userC.setUserEmail(userInfoCs[i][5].toString());
//				}
//				//默认密码 123456
//				userC.setUserPwd(MD5Utils.md5Password(SysConstant.userPwd));
//				//通过手机号获取DB中信息
//				UserInfoC DBuserInfoC = userInfoCMapper.selectByUserPhone(userC.getUserTel());
//				//如果DB中信息不为空
//				if(ObjUtils.isNotEmpty(DBuserInfoC)){
//					//执行修改操作
//					userC.setUserId(DBuserInfoC.getUserId());
//					userInfoCMapper.updateByPrimaryKeySelective(userC);
//				}else{
//					//执行插入操作
//					userInfoCMapper.insertSelective(userC);
//				}
//			}
//		}
	}


	/**
	 * 导出数据到Excel表格
	 * @param request
	 * @param response
	 * @param params
	 */
	@Override
	public void exportDataToExcelByParams(HttpServletRequest request, HttpServletResponse response,Map<String,Object>params) {
//		//通过条件获取用户数据
//		List<Map<String,Object>> userInfos = this.userInfoCMapper.getUsercPageList(null,params);
//
//		//创建列数组
//		String[] rowsName = new String[] {"注册时间","用户账号","姓名","认证","完成职位","总收入","余额","状态"};
//
//		List<Object[]> dataList = new ArrayList<Object[]>();
//
//		//循环取值
//		for (int i = 0; i < userInfos.size(); i++) {
//			//获取用户认证状态
//			Integer  isValidate= Integer.parseInt(userInfos.get(i).get("isValidate").toString());
//			//获取用户账户状态
//			Integer userStatus = Integer.parseInt(userInfos.get(i).get("userStatus").toString());
//			// 创建列数量长度的数组
//			Object[] objs = new Object[rowsName.length];
//			//注册时间
//			objs[0] = userInfos.get(i).get("createTime");
//					//用户账号
//					objs[1] =	userInfos.get(i).get("userTel");
//							//姓名
//							objs[2] =	userInfos.get(i).get("userName");
//									//认证
//									objs[3] =	isValidate.equals(SysConstant.GGLING_TYPE_JOB_CERTIFICATION_TRUE)?"是":"否";
//											//完成职位
//											objs[4] =	userInfos.get(i).get("completeJob");
//													//总收入
//													objs[5] =	userInfos.get(i).get("userMoney");
//															//余额
//															objs[6] =	userInfos.get(i).get("userAccount");
//															//如果用户为停用状态
//															if(userStatus.equals(SysConstant.GGLING_TYPE_USER_STATUS_FALSE)){
//																objs[7] ="已停用";
//															}
//															//如果是正常状态
//															if(userStatus.equals(SysConstant.GGLING_TYPE_USER_STATUS_TRUE)){
//																//如果已认证
//																if(isValidate.equals(SysConstant.GGLING_TYPE_JOB_CERTIFICATION_TRUE)){
//																	objs[7] ="正常";
//																}else{
//																	objs[7] ="待认证";
//																}
//															}
//
//			dataList.add(objs);
//		}
//		String fileName = "userDetail";
//		//执行导出
//		ExcelTool.exportExcel(request,response,fileName, rowsName, dataList, "yyyy-MM-dd HH:mm:ss");
	}


}
